package cn.xzhang.boot.controller;

import cn.dev33.satoken.annotation.SaCheckRole;
import cn.xzhang.boot.common.pojo.CommonResult;
import cn.xzhang.boot.common.pojo.PageResult;
import cn.xzhang.boot.constant.UserConstant;
import cn.xzhang.boot.model.dto.carousel.CarouselAddReqDTO;
import cn.xzhang.boot.model.dto.carousel.CarouselPageReqDTO;
import cn.xzhang.boot.model.dto.carousel.CarouselUpdateReqDTO;
import cn.xzhang.boot.model.entity.Carousel;
import cn.xzhang.boot.model.vo.carousel.CarouselSimpleVo;
import cn.xzhang.boot.model.vo.carousel.CarouselVo;
import cn.xzhang.boot.service.CarouselService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;

import static cn.xzhang.boot.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST_PARAMS;

/**
 * 轮播图管理
 *
 * @author <a href="https://github.com/XiaoZhangCode">XiaoZhangCode</a>
 */
@Tag(name = "管理后台 - 轮播图管理")
@RestController
@RequestMapping("/carousel")
public class CarouselController {

    @Resource
    private CarouselService carouselService;

    /**
     * 创建Carousel
     *
     * @param carouselReqDTO Carousel添加请求数据传输对象，包含新增Carousel的信息
     * @return 返回操作结果，其中包含新添加Carousel的ID
     */
    @PostMapping("/add")
    @Operation(summary = "创建轮播图")
    @SaCheckRole(UserConstant.ADMIN_ROLE)
    public CommonResult<Long> addCarousel(@RequestBody CarouselAddReqDTO carouselReqDTO) {
        if (carouselReqDTO == null) {
            return CommonResult.error(BAD_REQUEST_PARAMS);
        }
        // 调用服务层方法，添加，并获取添加结果
        long result = carouselService.addCarousel(carouselReqDTO);
        // 返回添加成功响应结果
        return CommonResult.success(result);
    }

    @PutMapping("/update")
    @Operation(summary = "更新轮播图信息")
    @SaCheckRole(UserConstant.ADMIN_ROLE)
    public CommonResult<Boolean> updateCarousel(@RequestBody @Valid CarouselUpdateReqDTO carouselReqDTO) {
        // 检查传入的请求数据是否为空
        if (carouselReqDTO == null) {
            return CommonResult.error(BAD_REQUEST_PARAMS);
        }
        // 调用服务层方法，更新信息，并获取更新结果
        boolean result = carouselService.updateCarousel(carouselReqDTO);
        // 返回更新信息成功响应结果
        return CommonResult.success(result);
    }

    @DeleteMapping("/delete")
    @Operation(summary = "删除轮播图")
    @SaCheckRole(UserConstant.ADMIN_ROLE)
    @Parameter(name = "id", description = "轮播图ID",required = true)
    public CommonResult<Boolean> deleteCarousel(@RequestParam("id") Long id) {
        // 检查传入的ID是否为空
        if (id == null) {
            return CommonResult.error(BAD_REQUEST_PARAMS);
        }
        // 调用服务层方法，删除
        boolean result = carouselService.deleteCarousel(id);
        // 返回删除成功响应结果
        return CommonResult.success(result);
    }

    @GetMapping("/get")
    @Operation(summary = "获取轮播图")
    @Parameter(name = "id", description = "轮播图ID",required = true)
    @SaCheckRole(UserConstant.ADMIN_ROLE)
    public CommonResult<CarouselVo> getCarousel(@RequestParam("id") Long id) {
        // 检查传入的ID是否为空
        if (id == null) {
            return CommonResult.error(BAD_REQUEST_PARAMS);
        }
        // 调用服务层方法，获取信息，并返回结果
        return CommonResult.success(carouselService.getCarouselVO(carouselService.getById(id)));
    }

    @GetMapping("/get/vo")
    @Operation(summary = "获取轮播图简要信息")
    @Parameter(name = "id", description = "轮播图ID",required = true)
    public CommonResult<CarouselSimpleVo> getCarouselVO(@RequestParam("id") Long id) {
        // 检查传入的ID是否为空
        if (id == null) {
            return CommonResult.error(BAD_REQUEST_PARAMS);
        }
        Carousel carousel = carouselService.getById(id);
        // 调用服务层方法，获取信息，并返回结果
        return CommonResult.success(carouselService.getSimpleCarouselVO(carousel));
    }

    @GetMapping("/page")
    @Operation(summary = "分页获取轮播图列表")
    @SaCheckRole(UserConstant.ADMIN_ROLE)
    public CommonResult<PageResult<CarouselVo>> getCarouselPage(CarouselPageReqDTO carouselPageReqDTO) {
        // 调用服务层方法，获取分页信息，并返回结果
        return CommonResult.success(carouselService.getCarouselPage(carouselPageReqDTO));
    }

}